package com.foftact.stockpereport.mapper;

import com.foftact.stockpereport.StockPEReport;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 股票财务分析报告Mapper接口
 * 用于数据库操作
 */
@Mapper
public interface StockPEReportMapper {
    /**
     * 插入单条股票财务分析报告数据
     * @param stockPEReport 股票财务分析报告数据
     * @return 影响行数
     */
    int insert(StockPEReport stockPEReport);

    /**
     * 批量插入股票财务分析报告数据
     * @param stockPEReportList 股票财务分析报告数据列表
     * @return 影响行数
     */
    int batchInsert(@Param("list") List<StockPEReport> stockPEReportList);

    /**
     * 根据股票代码和日期范围查询股票财务分析报告数据
     * @param securityCode 证券代码
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 股票财务分析报告数据列表
     */
    List<StockPEReport> selectByCodeAndDateRange(
            @Param("securityCode") String securityCode,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate
    );

    /**
     * 根据股票代码查询最新的一条股票财务分析报告数据
     * @param securityCode 证券代码
     * @return 股票财务分析报告数据
     */
    StockPEReport selectLatestByCode(@Param("securityCode") String securityCode);

    /**
     * 根据股票代码和报告期查询股票财务分析报告数据
     * @param securityCode 证券代码
     * @param reportDate 报告期
     * @return 股票财务分析报告数据
     */
    StockPEReport selectByCodeAndReportDate(
            @Param("securityCode") String securityCode,
            @Param("reportDate") Date reportDate
    );

    /**
     * 查询指定股票近20个季度的数据
     * @param securityCode 证券代码
     * @return 近20个季度的股票财务分析报告数据列表
     */
    List<StockPEReport> selectRecent20QuartersByCode(@Param("securityCode") String securityCode);

    /**
     * 插入或更新股票财务分析报告数据
     * 如果数据已存在则更新，不存在则插入
     * @param stockPEReport 股票财务分析报告数据
     * @return 影响行数
     */
    int insertOrUpdate(StockPEReport stockPEReport);

    /**
     * 根据股票代码和报告期更新股票财务分析报告数据
     * @param stockPEReport 股票财务分析报告数据
     * @return 影响行数
     */
    int updateByCodeAndReportDate(StockPEReport stockPEReport);

    /**
     * 根据股票代码删除所有相关数据
     * @param securityCode 证券代码
     * @return 影响行数
     */
    int deleteByCode(@Param("securityCode") String securityCode);

    /**
     * 删除超过指定天数的旧数据
     * @param days 天数
     * @return 影响行数
     */
    int deleteOldData(@Param("days") int days);

    /**
     * 查询所有股票财务分析报告数据
     * @return 股票财务分析报告数据列表
     */
    List<StockPEReport> selectAll();

    /**
     * 根据股票代码查询股票财务分析报告数据
     * @param securityCode 证券代码
     * @return 股票财务分析报告数据
     */
    StockPEReport selectBySecurityCode(@Param("securityCode") String securityCode);
}